package cn.le.algorithm;

import java.util.Random;

/**
 *
 * 打乱数据算法
 *
 */
public class ArrayUpset {

    public static void main(String[] args) {

        System.out.println(upset(new Integer[]{1,2,3,4,5}));
    }
    /**
     *
     * 算法思路
     * 随机从原数组中获取一个数放入新的数组中，则原数组中的这数已经被用过了，将无意义，那么从原数组的有效数组长度取最后一个元素放入当前位置，
     * 每当从数组中取走一个元素，那么原数组的有效数组长度将递减
     *
     * 从数组从取走一个元素，就将数组的最后一个元素放到被取走的位置，这个时候数组的有效数组长度就减一
     *
     * @param objs
     * @return
     */
    private static Object[] upset(Object[] objs)
    {

        Object[] newObjs = new Object[objs.length];

        for (int i = 0,length = objs.length; i < length; i++) {
            //确定有效数组值的长度
            int effective = length-i;
            //随机产生一个下标
            int rondom = getRondom(effective);
            //根据下标,回去旧数组中的数据,并写到新的数组中
            newObjs[i] = objs[rondom];
            //将旧数组中用过的数据,替换成没有用过的
            objs[rondom] = objs[effective-1];
        }

        return newObjs;
    }

    /**
     * 回去随机数
     * @param rondom
     * @return
     */
    private static int getRondom(int rondom)
    {
        Random ra =new Random();
        return ra.nextInt(rondom);
    }

}
